#include<iostream>
#include<thread>
using namespace std;
class A
{
public:
    void func1(int time, int n)
    {
        for (int i = 0; i < time; i++)
            cout << n << " ";
        cout << endl;
    }
    static void func2(int time, int n)
    {
        for (int i = 0; i < time; i++)
            cout << n << " ";
        cout << endl;
    }
};

struct f
{
    void operator()(int time, int n)
    {
        for (int i = 0; i < time; i++)
            cout << n << " ";
        cout << endl;
    }
};
int main()
{ 
    /*
        template<class Fn,class ...Args>

        thread(Fn&& fn,Args&&... args) 第一个参数:可调用对象 后面的参数：若干参数
    */
    //方式1:以类的非静态成员函数作为线程函数 ->必须传入this指针
    A a; 
    thread t1(&A::func1, &a, 2, 3);
    //方式2:以类的静态成员函数作为线程函数 ->必须传入this指针
    thread t2(&A::func2, 3, 4);
    //方式3:以仿函数作为线程函数
    thread t3(f(), 4, 5);

    //方式4:lambda表达式作为线程函数
    int num = 0;
    auto Add = [&num]() {
        int count = 5;
        while (count--)
        {
            cout << num << " ";
            num++;
        }
    };
    thread t4(Add);
    t1.join();
    t2.join();
    t3.join();
    t4.join();
    return 0;
}
